package com.springapp.dao.dao.impl;



import com.springapp.dao.dao.IListeTacheDAO;
import com.springapp.model.ArtConditionnement;
import com.springapp.model.Pal_ArtFou;
import com.springapp.model.Palette;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/*Created by Thomas on 29/06/14.
        */
@Repository
public class ListeTacheDAO implements IListeTacheDAO {
    @Autowired
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override



    public List<ArtConditionnement> getLstArtCond(int _iIDArtFou){
        List<ArtConditionnement> lstArtCond = new ArrayList<ArtConditionnement>();
        String sql="" +
                "SELECT *\n" +
                "FROM Art_Conditionnament AC\n" +
                "WHERE AC.IDArtFournisseur='"+_iIDArtFou+"'\n";

        Connection conn = null;
        try {
            conn=dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet result=ps.executeQuery();
            while(result.next()){
                lstArtCond.add(new ArtConditionnement(result.getInt("IDArticle"),result.getInt("IDConditionnement"),result.getInt("IDFournisseur"),result.getInt("Unite"),result.getInt("Poids"),result.getBoolean("EstEclatable"),_iIDArtFou));
            }
            result.close();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return lstArtCond;
    }

    public List<Pal_ArtFou> getListPalArtFou(int _iIDPalette){
        List<Pal_ArtFou> lstPalArtFou = new ArrayList<Pal_ArtFou>();
        String sql="" +
                "SELECT *\n" +
                "FROM Pal_ArtFou P\n" +
                "WHERE P.IDPalette='"+_iIDPalette+"'\n";

        Connection conn = null;
        try {
            conn=dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet result=ps.executeQuery();
            while(result.next()){
                lstPalArtFou.add(new Pal_ArtFou(result.getInt("IDPalArtFou"),_iIDPalette,result.getInt("IDArtFou"),result.getInt("QteArticle"),result.getInt("QteCarton")));
            }
            result.close();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return lstPalArtFou;
    }

    public int paletteMatch(int _idPalette,int _idArtFou,int _nbArticle) {
        /*
        Cette methode renvoi un indice sur la vérification de la palette scannée par rapport à celle attendue :
        Valeurs de retour :
        0 => OK
        1 => IDPalette n'existe pas
        2 => le nombre d'articles de cettte palette ne correspondent pas au nombre attendu
        3 => mauvais article ou mauvais fournisseur
        4 => pb de cohérence dans les données qui fait échouer la requête
         */
        int iMatch = 0;
        int iResIdPalette=0;
        int iResIdArticle=0;
        int iResQtePalette=0;
        int iResIdArtFou=0;
        int iNbArtPal=0;
        int iTmp=0;
        String sql="" +
                "SELECT Pal.IDPalette, ArtFou.IDArticle,Pal.IDArtFournisseur, Pal.QteActuellePalette\n," +
                "St.IdEmplacement, ArtFou.idArt\n"+
                "FROM Palette Pal\n" +
                "INNER JOIN Art_Fournisseur ArtFou ON Pal.IDArtFournisseur=ArtFou.IDArtFournisseur\n" +
                "INNER JOIN Pal_ArtFou Partfou ON Pal.IDPalette=Partfou.IDPalette\n" +
                "WHERE Pal.IDPalette='"+_idPalette+"'\n";
        Connection conn = null;
        try {
            conn=dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet result=ps.executeQuery();
            if(result.next()){
                iResIdPalette=result.getInt("IDPalette");
                iResIdArticle=result.getInt("IDArticle");
                iResQtePalette=result.getInt("QteActuellePalette");
                iResIdArtFou=result.getInt("IDArtFournisseur");
            }else{
                iMatch=4; //incohérence des données
            }
            result.close();
            ps.close();
            sql="" +
                    "SELECT IDConditionnement, Unite\n"+
                    "FROM Art_Conditionnement\n" +
                    "WHERE IDArtFournisseur='"+iResIdArtFou+"'\n";
            conn = null;

                conn=dataSource.getConnection();
                ps = conn.prepareStatement(sql);
                result=ps.executeQuery();
                while(result.next()){
                    iTmp=result.getInt("Unite");
                    if(iNbArtPal==0){
                        iNbArtPal=iTmp;
                    }else{
                        iNbArtPal=iNbArtPal*iTmp;
                    }
                }
                result.close();
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        // A ce stade nous avons toutes les variables qu'il nous faut pour voir si la palette correspond
        if(iResIdPalette!=_idPalette){iMatch=1;}
        if(iNbArtPal!=_nbArticle || iResQtePalette!=_nbArticle){iMatch=2;}
        if(iResIdArtFou!=_idArtFou){iMatch=3;}
        return iMatch;
    }

    public String getLibEmplacement(int _iDEmplacement){
        String sql=
                "SELECT allee, rang\n" +
                "FROM Emplacement\n" +
                "WHERE IDEmplacement='"+_iDEmplacement+"'";
        Connection conn = null;
        String sRet="Allee ";
        try {

            conn=dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet result=ps.executeQuery();
            if(result.next()){
                sRet+=Integer.toString(result.getInt("allee"));
                sRet+=" Rang ";
                sRet+=Integer.toString(result.getInt("rang"));

            }else{
                sRet="Introuvable";
            }
            result.close();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    return sRet;
    }
}
